package cc.rengu.igas.acct.facade;

import cc.rengu.igas.acct.facade.request.*;
import cc.rengu.igas.acct.facade.response.*;
import cc.rengu.igas.acct.facade.result.Result;

/**
 * 虚拟账户外放服务
 *
 * @author WKF
 * @author lizhangtao
 * 添加多商户预授权、多商户预授权撤销、多商户预授权完成服务
 * @version 1.0
 * @date 2020/5/8
 */
public interface VirtAcctService {
    /**
     * 虚拟账户开户接口
     *
     * @param virtAcctEstablishRequest 虚拟账户开户请求
     * @return 虚拟账户开户交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctEstablishResponse 中应答码对应状态与Result中布尔success中匹配
     * 开户成功返回虚拟账户账号，失败不返回
     */
    Result<VirtAcctEstablishResponse> virtAcctEstablish(VirtAcctEstablishRequest virtAcctEstablishRequest);

    /**
     * 虚拟账户余额查询
     *
     * @param virtAcctBalanceQueryRequest 虚拟账户余额查询请求
     * @return 多商户记账交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctBalanceQueryResponse 中应答码对应状态与Result中布尔success中匹配
     * 查询成功返回余额，查询失败不返回
     */
    Result<VirtAcctBalanceQueryResponse> virtAcctBalanceQuery(VirtAcctBalanceQueryRequest virtAcctBalanceQueryRequest);

    /**
     * 多商户记账
     *
     * @param virtAcctMultiMchntAdjustRequest 多商户记账请求其中记账明细为list
     * @return 多商户记账交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctMultiMchntAdjustResponse 中应答码对应状态与Result中布尔success中匹配
     * 多商户记账为原子操作要不全部记账成功，要不全部记账失败
     */
    Result<VirtAcctMultiMchntAdjustResponse> virtAcctMultiMchntAdjust(VirtAcctMultiMchntAdjustRequest virtAcctMultiMchntAdjustRequest);

    /**
     * 虚拟账户预授权撤销交易
     *
     * @param virtAcctPreAuthCancelRequest 上送原记账流水
     * @return 虚拟账户预授权撤销交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctPreAuthCancelResponse 中应答码对应状态与Result中布尔success中匹配
     */
    Result<VirtAcctPreAuthCancelResponse> virtAcctPreAuthCancel(VirtAcctPreAuthCancelRequest virtAcctPreAuthCancelRequest);

    /**
     * 虚拟账户预授权完成交易
     *
     * @param virtAcctPreAuthCompRequest 上送原预授权返回的记账流水
     * @return 虚拟账户预授权交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctPreAuthCompResponse 中应答码对应状态与Result中布尔success中匹配
     */
    Result<VirtAcctPreAuthCompResponse> virtAcctPreAuthComp(VirtAcctPreAuthCompRequest virtAcctPreAuthCompRequest);

    /**
     * 虚拟账户预授权交易
     *
     * @param virtAcctPreAuthRequest 虚拟账户预授权请求
     * @return 虚拟账户预授权交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctPreAuthResponse 中应答码对应状态与Result中布尔success中匹配
     * 成功返回记账流水
     */
    Result<VirtAcctPreAuthResponse> virtAcctPreAuth(VirtAcctPreAuthRequest virtAcctPreAuthRequest);

    /**
     * 虚拟账户单笔记账
     *
     * @param virtAcctSingleAdjustRequest 支持借贷两个方向需要请求指定
     * @return 虚拟账户单笔记账交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctSingleAdjustResponse 中应答码对应状态与Result中布尔success中匹配
     */
    Result<VirtAcctSingleAdjustResponse> virtAcctSingleAdjust(VirtAcctSingleAdjustRequest virtAcctSingleAdjustRequest);

    /**
     * 虚拟账户单笔交易明细查询
     *
     * @param virtAcctSingleTransDetailQueryRequest 上送原记账流水
     * @return 虚拟账户单笔交易明细查询结果
     * 查询交易状态以Result中布尔success为准，true为成功存在应答，，false为失败
     */
    Result<VirtAcctSingleTransDetailQueryResponse> virtAcctSingleTransDetailQuery(VirtAcctSingleTransDetailQueryRequest virtAcctSingleTransDetailQueryRequest);

    /**
     * 虚拟账户账户状态修改
     *
     * @param virtAcctStatusChangeRequest 是否保留客户信息需指定
     * @return 虚拟账户状态修改结果
     * 修改交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctStatusChangeResponse中应答码对应状态与Result中布尔success中匹配
     */
    Result<VirtAcctStatusChangeResponse> virtAcctStatusChange(VirtAcctStatusChangeRequest virtAcctStatusChangeRequest);

    /**
     * 虚拟账户交易明细查询
     *
     * @param virtAcctTransDetailQueryRequest 支持日期起止时间的所有交易明细查询，
     *                                        支持分页每页记录数及当前需要查询的页数需指定
     * @return 虚拟账户交易明细查询应答，
     * 查询交易状态以Result中布尔success为准，true为成功，false为失败
     * 成功则返回查询条件指定的交易明细
     */
    Result<VirtAcctTransDetailQueryResponse> virtAcctTransDetailQuery(VirtAcctTransDetailQueryRequest virtAcctTransDetailQueryRequest);

    /**
     * 虚拟账户交易状态查询
     *
     * @param virtAcctTransStatusQueryRequest 上送原记账流水
     * @return 虚拟账户查询应答结果
     * 查询交易本身状态以Result中布尔success为准，true为成功，false为失败
     * 业务的状态需要在VirtAcctTransStatusQueryResponse中判断
     */
    Result<VirtAcctTransStatusQueryResponse> virtAcctTransStatusQuery(VirtAcctTransStatusQueryRequest virtAcctTransStatusQueryRequest);

    /**
     * 多商户预授权
     *
     * @param virtAcctMultiMchntPreAuthRequest 多商户记账请求其中记账明细为list
     * @return 多商户预授权交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctMultiMchntPreAuthResponse 中应答码对应状态与Result中布尔success中匹配
     * 多商户记账为原子操作要不全部预授权成功，要不全部预授权失败
     */
    Result<VirtAcctMultiMchntPreAuthResponse> virtAcctMultiMchntPreAuth(VirtAcctMultiMchntPreAuthRequest virtAcctMultiMchntPreAuthRequest);

    /**
     * 多商户预授权撤销
     *
     * @param virtAcctMultiMchntPreAuthCancelRequest 多商户记账请求其中记账明细为list
     * @return 多商户预授权撤销交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctMultiMchntPreAuthCancelResponse 中应答码对应状态与Result中布尔success中匹配
     * 多商户记账为原子操作要不全部预授权成功，要不全部预授权失败
     */
    Result<VirtAcctMultiMchntPreAuthCancelResponse> virtAcctMultiMchntPreAuthCancel(VirtAcctMultiMchntPreAuthCancelRequest virtAcctMultiMchntPreAuthCancelRequest);

    /**
     * 多商户预授权完成
     *
     * @param virtAcctMultiMchntPreAuthCompRequest 多商户记账请求其中记账明细为list
     * @return 多商户预授权撤销交易结果
     * 交易状态以Result中布尔success为准，true为成功，false为失败
     * VirtAcctMultiMchntPreAuthCompResponse 中应答码对应状态与Result中布尔success中匹配
     * 多商户记账为原子操作要不全部预授权成功，要不全部预授权失败
     */
    Result<VirtAcctMultiMchntPreAuthCompResponse> virtAcctMultiMchntPreAuthComp(VirtAcctMultiMchntPreAuthCompRequest virtAcctMultiMchntPreAuthCompRequest);
}
